package com.nyt.report.util;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;



/**
 * @description:签名工具类
 * @author DEFU
 * @date 2019-04-01 15:25:18
 */
public class SignKit {

	/**
     * 生成签名
	 * @param accesskey 公密
	 * @param secretkey 私密
     * @param bodytemp  签名字符串
	 * @param requestid 唯一标识
	 * @param requesttime 请求时间
     * return String 签名数据
     */  
    public static String getSignature(String accesskey,String secretkey,String bodytemp,String requestid,String requesttime) {
		if (StringUtils.isNotBlank(accesskey) && StringUtils.isNotBlank(requesttime) && StringUtils.isNotBlank(requestid)){
	        String[] arr = new String[] {accesskey,secretkey,bodytemp,requestid,requesttime};
	        Arrays.sort(arr);  // 将参数进行字典序排序
	        StringBuilder content = new StringBuilder();
			Arrays.stream(arr).forEach(content::append);
	        // 将加密后的字符串返回
			return toMD5Digest(content);
    	}
    	return null;
    }
  
    /** 
     * 验证签名
     * @param signature 签名数据
	 * @param accesskey 公密
	 * @param secretkey 私密
     * @param bodytemp  签名字符串
	 * @param requestid 唯一标识
	 * @param requesttime 请求时间
     * return Boolean 验证结查
     */  
    public static boolean checkSignature(String signature,String accesskey,String secretkey,String bodytemp,String requestid,String requesttime) {
    	if (StringUtils.isNotBlank(accesskey) && StringUtils.isNotBlank(requesttime) && StringUtils.isNotBlank(requestid)){
	        String signtemp = getSignature(accesskey,secretkey,bodytemp,requestid,requesttime);
	        if(StringUtils.isBlank(signtemp)){
	        	return false;
			}
	        // 将加密后的字符串可与signature对比
	        return signtemp.equals(signature);
    	}
    	return false;
    }

    /** 
     * 加密
     * @param content 
     * return String
     */
    public static String toMD5Digest(StringBuilder content){
		try {
			//加密算法
			//"MD2","MD5","SHA-1","SHA-256","SHA-384","SHA-512"
			String ALGORITHM = "MD5";
			MessageDigest md = MessageDigest.getInstance(ALGORITHM);
			// 将三个参数字符串拼接成一个字符串进行加密
			byte[] digest = md.digest(content.toString().getBytes("UTF-8"));
			return byteToStr(digest);
		} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return "";
	}

  
    /** 
     * 将字节数组转换为十六进制字符串 
     * @param byteArray
     * return String
     */  
    private static String byteToStr(byte[] byteArray) {  
        StringBuilder strDigest = new StringBuilder();
		for (byte aByteArray : byteArray) {
			strDigest.append(byteToHexStr(aByteArray));
		}
        return strDigest.toString();
    }  
  
    /** 
     * 将字节转换为十六进制字符串
     * @param mByte
     * return String
     */  
    private static String byteToHexStr(byte mByte) {  
        char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };  
        char[] tempArr = new char[2];  
        tempArr[0] = Digit[(mByte >>> 4) & 0X0F];  
        tempArr[1] = Digit[mByte & 0X0F];
		return new String(tempArr);
    }
}
